// 写一个抽象工厂模式的例子
// 1. 创建一个接口
interface Factory {
    createProductA(): ProductA;
    createProductB(): ProductB;
}
  
// 2. 创建一个接口的实现类
class Factory1 implements Factory {
    create(name: string): Product1 | Product2 {
        throw new Error("Method not implemented.");
    }
    createProductA(): ProductA {
      return new ProductA1();
    }
    createProductB(): ProductB {
      return new ProductB1();
    }
  }
  
  // 3. 创建一个接口的实现类
  class Factory2 implements Factory {
    create(name: string): Product1 | Product2 {
        throw new Error("Method not implemented.");
    }
    createProductA(): ProductA {
      return new ProductA2();
    }
    createProductB(): ProductB {
      return new ProductB2();
    }
  }
  
  // 4. 创建一个接口
  interface ProductA {
    doSomething(): void;
  }
  
  // 5. 创建一个接口的实现类
  class ProductA1 implements ProductA {
    doSomething(): void {
      console.log("ProductA1");
    }
  }
  
  // 6. 创建一个接口的实现类
  class ProductA2 implements ProductA {
    doSomething(): void {
      console.log("ProductA2");
    }
  }
  
  // 7. 创建一个接口
  interface ProductB {
    doSomething(): void;
  }
  
  // 8. 创建一个接口的实现类
  class ProductB1 implements ProductB {
    doSomething(): void {
      console.log("ProductB1");
    }
  }
  
  // 9. 创建一个接口的实现类
  class ProductB2 implements ProductB {
    doSomething(): void {
      console.log("ProductB2");
    }
  }
  
  // 10. 创建一个抽象工厂
  const createFactory = (type: string): Factory => {
    if (type === "Factory1") {
      return new Factory1();
    }
    if (type === "Factory2") {
      return new Factory2();
    }
    return null;
  };
  
  // 11. 创建一个工厂
  const factory1 = createFactory("Factory1");
  const factory2 = createFactory("Factory2");
  
  // 12. 通过工厂创建产品
  const productA1 = factory1.createProductA();
  const productB1 = factory2.createProductB();

  // 13. 执行产品的方法
  productA1.doSomething();
  productB1.doSomething();